import hashlib
import logging
import random
import re

from flask import current_app, jsonify
from flask import make_response
from flask import request
from flask import session

from ihome import constants
from ihome import redis_store, db

from ihome.api_1_0 import api
from werkzeug.security import generate_password_hash,check_password_hash
# 生成验证码
from ihome.libs.yuntongxun.sms import CCP
from ihome.models import User
from ihome.utils.captcha.captcha import captcha
from ihome.utils.response_code import RET

#处理请求生成图片验证码
@api.route('/imagecode')
def generate_image_code():

    # 获取到之前的id和当前的id
    # pre_image_id =request.args.get("pre")#验证码编号


    #1。获取uuid ,
    cur_image_id =request.args.get("cur")
    #判空
    if not cur_image_id:
        return jsonify(errno=RET.DATAERR,errmsg="数据错误")

    # 生成验证码信息，第一个时图片名字，第二个是验证码文本，地三个时验证码文本内容
    name, text, image = captcha.generate_captcha()

    try:
        # 3.保存图片验证码文本到redis中，通过uuid获取值,加个前缀自定义，然后300秒
        redis_store.set("ImageCode_" + cur_image_id, text,constants.SMS_CODE_REDIS_EXPIRES)

    except Exception as e:
        current_app.logger.error(e)

        return jsonify(errno=RET.DBERR, errmsg="数据错误")

    return image




@api.route("/smscode",methods=["POST","GET"])
def send_sms_code():

    # 发送短信验证码实现流程：
    # 接收前端发送过来的请求参数
    # alert(resp.errmsg);
    data_dict =request.json

    mobile =data_dict.get("mobile")
    image_code =data_dict.get("image_code")#用户输入的图片验证码
    image_code_id=data_dict.get("image_code_id")#图片验证码的uuid


    #验证码用户输入的图形的验证码
    # 检查参数是否已经全部传过来
    if not all([image_code,image_code_id,mobile]):
        return jsonify(errno=RET.PARAMERR, errmsg='参数错误')

    # 判断手机号格式是否正确
    if not re.match("^1[3578]\d{9}$",mobile):
        return jsonify(errno=RET.PARAMERR, errmsg='手机号码错误')


    #从redis中获取真实的图片雁阵吗（通过Uuid）
    # 检查图片验证码是否正确，若不正确，则返回
    try:
        real_image_code =redis_store.get("ImageCode_"+image_code_id)#手动输入的验证码
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='查询数据异常')

    # 判断验证码是否存在(不存在就是过期)
    if not real_image_code:
        return jsonify(errno=RET.NODATA, errmsg='验证码已过期')


    # 比较传入的验证码和本地验证码是否一致 #变小写
    if image_code.lower() !=real_image_code.decode().lower():
        return jsonify(errno=RET.DATAERR, errmsg='验证码错误')

    # 查询数据库，手机号码是否存在

    try:
        user = User.query.filter(User.mobile == mobile).first()

    except Exception as e:
        current_app.logger.error(e)
        db.session.rollback()
        return jsonify(errno=RET.DATAEXIST, errmsg='数据库操作错误')

    #如果已经存在则不给过
    if user:
        return jsonify(errno=RET.DATAEXIST, errmsg='手机号码已存在')


    # 生成随机的短信验证码
    sms_code = "%06d"%random.randint(0,1000000)
    print(sms_code)
    # 发送短信验证码
    ccp = CCP()
    # 注意： 测试的短信模板编号为1
    # result =ccp.send_template_sms(mobile, [sms_code, 5], 1)

    # 如果短信发送成功返回0失败则1
    # if result !=0:
    #     return jsonify(errno=RET.THIRDERR, errmsg='短信验证码发送失败')

    #保存真实
    try:
        #把断言验证码保存起来，加前缀“SMSCode”,设置有效期,短信验证码
        redis_store.setex("SMSCode"+mobile,constants.SMS_CODE_REDIS_EXPIRES,sms_code)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='保存短信验证码失败')


    return jsonify(errno=RET.OK, errmsg='发送验证码成功',data=sms_code)



@api.route("/users",methods=["POST"])
def users_code():
    #获取参数。判空
    data_dict = request.json

    mobile = data_dict.get("mobile")
    password=data_dict.get("password")
    password2=data_dict.get("password2")
    phoneCode=data_dict.get("phonecode")#手机验证码uuid


    if not all([mobile,password,password2,phoneCode]):
        return jsonify(errno=RET.DBERR, errmsg='保存短信验证码失败')

    #查询数据库用户信息
    try:
        user = User.query.filter(User.mobile == mobile).first()

    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='数据库查询错误')

    if user:
        return jsonify(errno=RET.USERERR, errmsg='用户以存在')

    #对比密码是否一致
    if password!=password2:
        return jsonify(errno=RET.DATAERR, errmsg='密码错误')

    try:
        real_sms_code = redis_store.get("SMSCode" + mobile)  # 手动输入的手机号码
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='查询数据异常')

    # 判断短信验证码是否存在(不存在就是过期)
    if not real_sms_code:
        return jsonify(errno=RET.NODATA, errmsg='验证码已过期')

    # 比较传入的短信验证码 #
    if phoneCode != real_sms_code.decode():
        return jsonify(errno=RET.DATAERR, errmsg='输入的短信验证码错误')

    #创建对象
    user =User()
    user.mobile=mobile
    #设置加密密码

    user.password_hash=generate_password_hash(password)
    user.name=mobile
    #获取密码

    try:
        db.session.add(user)
        db.session.commit()
    except Exception as e:
        current_app.logger.error(e)
        db.session.rollback()
        return jsonify(errno=RET.DBERR, errmsg='数据库操作失败')


    # 保持登录状态
    session["user_id"]=user.id
    session["mobile"]=user.mobile
    session["name"]=user.name


    #注册成功，实际上在用户表中多一条记录(即对象),昵称，手机号，密码不位空
    return jsonify(errno=RET.OK, errmsg='注册成功')



